package com.example.airkiss;

import com.example.airkiss.utils.WXConstants;
import com.google.gson.Gson;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import weixin.popular.api.PayMchAPI;
import weixin.popular.bean.paymch.*;
import weixin.popular.client.LocalHttpClient;
import weixin.popular.util.PayUtil;
import weixin.popular.util.XMLConverUtil;

import java.math.BigDecimal;
import java.util.UUID;

/**
 * @description:微信支付JAVA-SDK: APP支付,退款
 * @author:小黑
 */
public class WechatPayService {
    private static final Logger LOGGER = LoggerFactory.getLogger(WechatPayService.class);

    /************ 微信开放平台配置  ***************/

    /** APPID */
    private static final String APPID = WXConstants.WX_APPID;

    /** 商户号 */
    private static final String MCH_ID = WXConstants.MCH_ID;

    /** 密钥 */
    private static final String PRIVATE_KEY = WXConstants.KEY;

    /** 用户订单支付结果异步通知url */
    private static final String NOTIFY_URL =  WXConstants.NOTIFY_URL;

    /** 商户支付证书路径 */
    private static final String API_CLIENT_CERT_PATH = "D:\\zhengshu\\apiclient_cert.p12";

    // 加载商户支付证书文件;
    static {
        LocalHttpClient.initMchKeyStore(MCH_ID, API_CLIENT_CERT_PATH);
    }

    /**
     * @description:使用微信支付-APP支付方式-统一下单;
     * @return 支付参数,如果支付失败则返回null
     * @author:Fanhaojian
     */
    public MchPayApp orderAppPay() {

        Unifiedorder unifiedorder = new Unifiedorder();

        /** APPID */
        unifiedorder.setAppid(APPID);

        /** 商户号 */
        unifiedorder.setMch_id(MCH_ID);

        /** 随机字符串 */
        unifiedorder.setNonce_str(UUID.randomUUID().toString().replaceAll("-", ""));

        /** 商品描述 */
        unifiedorder.setBody("买水了");

        /** 商户订单号 */
        unifiedorder.setOut_trade_no("wy"+System.currentTimeMillis());

        /** 订单总金额 */
        unifiedorder.setTotal_fee("1");   // 订单总金额,单位为分;

        /** 用户端请求IP地址 */
        unifiedorder.setSpbill_create_ip("127.0.0.1");

        /** 异步通知回调地址 */
        unifiedorder.setNotify_url(NOTIFY_URL);

        /** 交易类型 */
        unifiedorder.setTrade_type("APP");

        LOGGER.warn("微信APP支付--(签名前):" + XMLConverUtil.convertToXML(unifiedorder));

        /** 获取签名 */
        UnifiedorderResult unifiedorderResult = PayMchAPI.payUnifiedorder(unifiedorder, PRIVATE_KEY);

        LOGGER.warn("微信APP支付--支付统一下单接口请求状态(return_code):" + unifiedorderResult.getReturn_code());
        LOGGER.warn("微信APP支付--支付统一下单接口请求状态(return_msg):" + unifiedorderResult.getReturn_msg());
        LOGGER.warn("微信APP支付--支付统一下单接口请求状态(result_code):" + unifiedorderResult.getResult_code());
        LOGGER.warn("微信APP支付--支付请求参数封装(签名后):" + XMLConverUtil.convertToXML(unifiedorder));
        LOGGER.warn("微信APP支付--支付统一下单接口返回数据:" + new Gson().toJson(unifiedorderResult));

        // 下单结果验签;
        if(unifiedorderResult.getSign_status() != null && unifiedorderResult.getSign_status()) {
            LOGGER.warn("微信APP支付验签成功");
            return PayUtil.generateMchAppData(unifiedorderResult.getPrepay_id(), APPID, MCH_ID, PRIVATE_KEY);
        }
        return null;
    }

    public static void main(String[] args) {
        WechatPayService wechatPayService = new WechatPayService();
        wechatPayService.refundOrder();
    }

    /**
     * @description:微信退款业务封装(支付押金退还);
     * @param 　 PayLog order:支付订单信息
     *           Double refundAmount:退款金额
     * @return 微信退款接口返回数据  true 退款成功  false 退款失败
     * @author:FanHaoJian
     */
    public Boolean refundOrder() {
        // 调用微信支付退款接口;
        SecapiPayRefund payRefund = new SecapiPayRefund();
        payRefund.setAppid(APPID);
        payRefund.setMch_id(MCH_ID);
        payRefund.setNonce_str(UUID.randomUUID().toString().replaceAll("-", ""));
        payRefund.setOut_trade_no("wy1533733411703");//支付订单号
        payRefund.setOut_refund_no("wy"+System.currentTimeMillis());//退款单号
        payRefund.setTotal_fee(1);//原订单金额,单位:分;
        payRefund.setRefund_fee(1);//退款订单金额,单位:分;

        SecapiPayRefundResult refundResult = PayMchAPI.secapiPayRefund(payRefund, PRIVATE_KEY);

        // 微信支付退款接口返回数据验签;
        if(refundResult.getSign_status() != null && refundResult.getSign_status()) {
            LOGGER.warn("微信退款接口--接口请求状态(return_code):" + refundResult.getReturn_code());
            LOGGER.warn("微信退款接口--接口请求状态(return_msg):" + refundResult.getReturn_msg());

            // 退款信息提交成功;
            if("SUCCESS".equals(refundResult.getReturn_code())) {
                LOGGER.warn("微信退款接口--接口请求状态(result_code):" + refundResult.getResult_code());
                LOGGER.warn("微信退款接口--接口请求状态(err_code):" + refundResult.getErr_code());
                LOGGER.warn("微信退款接口--接口请求状态(err_code_des):" + refundResult.getErr_code_des());

                return Boolean.TRUE;
            }
        }

        return Boolean.FALSE;
    }
}
